//
//  main.c
//  队列的顺序存储gsy
//
//  Created by Song on 2018/3/13.
//  Copyright © 2018年 Song. All rights reserved.
//

// 队列的顺序存储 - 循环队列

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define maxSize 5

struct node {
    int data[maxSize];
    int front; // 队头 出队使用
    int rear; // 队尾 入队使用
};
typedef struct node SqQueue;

// 初始化
void initQuence(SqQueue *queue) {
//    queue = (SqQueue *)malloc(sizeof(SqQueue));
    queue->front = 0;
    queue->rear = 0;
}

// 入队
void addQueue(SqQueue *q, int x) {
    if ((q->rear +1) % maxSize == q->front) { // 预留一个位置，但认为是满的
        printf("队列已经满了\n");
        return;
    }else {
        q->data[q->rear] = x; // 元素 x 赋值给队尾
        q->rear = (q->rear +1) % maxSize;  // 队尾加一
    }
}

// 出队
int outQueue(SqQueue *q) {
    int x;
    if (q->rear == q->front) { // 空队列
        printf(" = 队列是空的 = ");
        return 0;
    } else { // 队列：先出队头的元素
        x = q->data[q->front];
        q->front = (q->front + 1) % maxSize; // 队头加一
        return x;
    }
}

// 打印
void printfQueue(SqQueue *q) {
    int i;
    i = q->front % maxSize; // 从队头开始
    printf("打印队列中的元素（从头到尾）：");
    while (i != (q->rear)) {
        printf("%d ",q->data[i]);
        i = (i+1) % maxSize;
    }
    printf("\n");
}

// 求长度
int QueueLength(SqQueue *q) {
    return (q->rear - q->front + maxSize) % maxSize;
}

int main() {
    
    SqQueue *q;
    int e,num;
    initQuence(q); // 初始化
    printf("想要输入多少个进入队列：");
    scanf("%d",&num);
    for (int i = 0; i < num; i++) { // 放入num-1个元素 就认为是满的
        printf("输入第%d个元素：",i+1);
        scanf("%d",&e);
        addQueue(q, e);
    }
    printf("\n");
    printfQueue(q);
    
    // 长度
    int length;
    length = QueueLength(q);
    printf("长度是：%d\n",length);
    
    // 出队
    int outE;
    outE = outQueue(q);
    printf("出队的元素是：%d\n",outE);
    
    printfQueue(q);
    length = QueueLength(q);
    printf("长度是：%d\n",length);
    
    return 0;
}

//#include<stdio.h>
//#include<stdlib.h>
//#define MaxSize 5
//typedef struct node* SeQuence;
//struct node {
//    char data[MaxSize];
//    int Front, Rear; //Front队头，出队用，Rear队尾，入队用
//};
////初始化
//void InitQuence(SeQuence *L) {
//    (*L) = (SeQuence)malloc(sizeof(struct node));
//    (*L)->Front = 0;
//    (*L)->Rear = 0;
//}
////入队
//void AadQuence(SeQuence L, char x) {
//
//    if ((L->Rear + 1) % MaxSize == L->Front) { //Front和Rear相遇队列满
//        printf("满队列");
//    }
//    else {
//        L->Rear = (L->Rear + 1) % MaxSize;  //队尾加一
//        L->data[L->Rear] = x;
//    }
//}
////出队
//void DeQuence(SeQuence L, char *x) {
//    if (L->Front ==L->Rear) { //相等说明空队列
//        printf("空队列");
//    }
//    else {
//        L->Front = (L->Front + 1) % MaxSize; //队头加一
//        *x = L->data[L->Front];
//    }
//}
//void PrintQuence(SeQuence L) {
//    int i;
//    i = (L->Front + 1) % MaxSize; //队头加一开始遍历
//    while (i != L->Rear) {
//        printf("%c", L->data[i]);
//        i = (i + 1) % MaxSize;
//    }
//    printf("%c", L->data[i]); //队尾
//    printf("\n");
//}
//int main() {
//    SeQuence q;
//    char* y;
//    char x;
//    y = &x;
//    InitQuence(&q);
//    printf("输入数据:\n");
//    scanf("%c", &x);
//    while (x != '\n') {
//        AadQuence(q, x);
//        scanf("%c", &x);
//    }
//    PrintQuence(q);
//    DeQuence(q, y);
//    printf("出队数据是:%c\n",*y);
//    printf("剩余:\n");
//    PrintQuence(q);
//
//}


